Java集成MongoDB查询ISODate问题 | 您所在的位置:网站首页 › java mongodb 日期查询 › Java集成MongoDB查询ISODate问题 |
Date sDate = DateUtils.parseDate(start, "yyyy-MM-dd HH:mm:ss");
Date eDate = DateUtils.parseDate(end, "yyyy-MM-dd HH:mm:ss");
Sort sort = Sort.by(Sort.Direction.ASC, "date_time");
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("point").in(pointIDs);
criteria.and("date_time").gte(DateUtils.dateToISODate(sDate).getTime())
.lte(DateUtils.dateToISODate(eDate).getTime());
query.addCriteria(criteria);
query.with(sort);
mongoTemplate.find(query, VBTTrendCurve.class, TREND_CURVE);
public static Date dateToISODate(Date date){
SimpleDateFormat format =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
String isoDate = format.format(date);
try {
return format.parse(isoDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
不废话,上代码,mongodb数据库中的date_time是ISODate类型,对应映射的是Date类型,现在有一个问题,如上代码对于时间的区间查询无法正取匹配,也就是说,gte和lte函数转化之后的数据不对。 WDNMD,怎么办,弄了很久,最后被逼无奈,采取原生方式进行解决: StringBuilder pointsSB = new StringBuilder(); for (String item : pointIDs) { pointsSB.append("\""); pointsSB.append(item); pointsSB.append("\""); pointsSB.append(","); } StringBuilder stringBuilder = new StringBuilder("{\n" + " \"point\": {\n" + " \"$in\": [\n"); stringBuilder.append(pointsSB.toString().substring(0, pointsSB.toString().length() - 1)); stringBuilder.append(" ]\n" + " },\n" + " \"date_time\": {\n"); stringBuilder.append(" $gte: ISODate(\"" + DateUtils.getISODate(sDate) + "\"),\n"); stringBuilder.append(" $lte: ISODate(\"" + DateUtils.getISODate(eDate) + "\")\n"); stringBuilder.append(" }\n" + "}"); MongoCursor cursor = mongoTemplate.getCollection(TREND_CURVE).find(Document.parse(stringBuilder.toString())).iterator(); VBTTrendCurve vbtTrendCurve; while (cursor.hasNext()) { vbtTrendCurve = JSONObject.parseObject(JSON.toJSONString(cursor.next()), VBTTrendCurve.class); vbtTrendCurve.setDateTime(DateUtils.calDate(vbtTrendCurve.getDateTime(), Calendar.HOUR, -8)); result.add(vbtTrendCurve); } public static String getISODate(Date date){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "UTC"))); String isoDate = format.format(date); try { return formatDate(format.parse(isoDate) , "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); } catch (ParseException e) { e.printStackTrace(); } return null; }原生方法可以解决ISODate问题,但是!需要用迭代器去进行遍历。我还是更倾向于用Query方式去做,所以,我还在继续摸索关于ISODate问题。 如果各位小伙伴有好的解决方案,请不吝赐教,谢谢。 |
CopyRight 2018-2019 实验室设备网 版权所有 |